package com.rd.common.utils;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * 文件下载工具类（使用Hutool简化版）
 * 用于下载网络文件到本地
 */
@Slf4j
@Component
public class FileDownloadUtil {

    /**
     * 头像存储根目录
     * 根据操作系统自动选择路径
     */
    private static final String AVATAR_ROOT_DIR = getAvatarRootDir();

    /**
     * Web访问路径前缀
     */
    private static final String WEB_AVATAR_PREFIX = "/avatar/";

    /**
     * 获取头像存储根目录
     * 根据操作系统自动选择合适路径
     *
     * @return 头像存储根目录
     */
    private static String getAvatarRootDir() {
        return "";
    }

    /**
     * 下载头像文件
     *
     * @param avatarUrl 头像URL
     * @param userId    用户ID（用于生成唯一文件名）
     * @return 本地文件路径，如果下载失败返回null
     */
    public static String downloadAvatar(String avatarUrl, String userId) {
        if (StrUtil.isBlank(avatarUrl)) {
            log.warn("头像URL为空，跳过下载");
            return null;
        }

        if (StrUtil.isBlank(userId)) {
            log.warn("用户ID为空，跳过下载");
            return null;
        }

        try {
            // 确保根目录存在
            createAvatarRootDirectory();

            // 生成唯一文件名（包含用户ID前缀）
            String fileName = generateFileNameWithUserId(avatarUrl, userId);
            String localPath = AVATAR_ROOT_DIR + File.separator + fileName;

            // 使用Hutool下载文件
            boolean success = downloadFileWithHutool(avatarUrl, localPath);
            if (success) {
                log.info("头像下载成功: {} -> {}", avatarUrl, localPath);
                return localPath;
            } else {
                log.error("头像下载失败: {}", avatarUrl);
                return null;
            }
        } catch (Exception e) {
            log.error("下载头像时发生异常: {}", avatarUrl, e);
            return null;
        }
    }

    /**
     * 创建头像根目录
     */
    private static void createAvatarRootDirectory() {
        Path path = Paths.get(AVATAR_ROOT_DIR);
        if (!Files.exists(path)) {
            FileUtil.mkdir(path);
            log.info("创建头像根目录: {}", AVATAR_ROOT_DIR);
        }
    }

    /**
     * 生成包含用户ID的唯一文件名
     *
     * @param avatarUrl 原始URL
     * @param userId    用户ID
     * @return 文件名
     */
    private static String generateFileNameWithUserId(String avatarUrl, String userId) {
        String extension = getFileExtension(avatarUrl);
        // 使用用户ID作为文件名前缀，确保唯一性
        return userId + "\\" + IdUtil.fastSimpleUUID() + extension;
    }

    /**
     * 生成唯一文件名（不包含用户ID）
     *
     * @param avatarUrl 原始URL
     * @return 文件名
     */
    private static String generateFileName(String avatarUrl) {
        String extension = getFileExtension(avatarUrl);
        return IdUtil.fastSimpleUUID() + extension;
    }

    /**
     * 获取文件扩展名
     *
     * @param url 文件URL
     * @return 扩展名（包含点号）
     */
    private static String getFileExtension(String url) {
        if (StrUtil.isBlank(url)) return ".jpg";
        
        // 从URL中提取扩展名
        String extension = FileUtil.extName(url);
        if (StrUtil.isNotBlank(extension)) {
            extension = "." + extension.toLowerCase();
            // 只允许图片格式
            if (extension.matches("\\.(jpg|jpeg|png|gif|webp)$")) {
                return extension;
            }
        }
        return ".jpg";
    }

    /**
     * 使用Hutool下载文件
     *
     * @param fileUrl   文件URL
     * @param localPath 本地保存路径
     * @return 是否下载成功
     */
    private static boolean downloadFileWithHutool(String fileUrl, String localPath) {
        try {
            // 使用HttpUtil.downloadFile方法
            long size = HttpUtil.downloadFile(fileUrl, localPath);
            
            // 检查文件是否下载成功
            if (size > 0) {
                log.info("文件下载成功，大小: {} bytes", size);
                return true;
            } else {
                log.error("文件下载失败，文件大小为0: {}", fileUrl);
                return false;
            }
        } catch (Exception e) {
            log.error("使用Hutool下载文件时发生异常: {}", fileUrl, e);
            return false;
        }
    }

    /**
     * 将本地文件路径转换为Web访问路径
     *
     * @param localPath 本地文件路径
     * @return Web访问路径
     */
    public static String convertToWebPath(String localPath) {
        if (StrUtil.isBlank(localPath)) {
            return null;
        }

        // 提取相对路径部分
        String relativePath = localPath.replace(AVATAR_ROOT_DIR, "");
        // 转换为Web路径
        return WEB_AVATAR_PREFIX + relativePath;
    }

    /**
     * 将Web访问路径转换为本地文件路径
     *
     * @param webPath Web访问路径
     * @return 本地文件路径
     */
    public static String convertToLocalPath(String webPath) {
        if (StrUtil.isBlank(webPath) || !webPath.startsWith(WEB_AVATAR_PREFIX)) {
            return webPath; // 如果不是Web路径，直接返回
        }

        // 提取相对路径
        String relativePath = webPath.substring(WEB_AVATAR_PREFIX.length());
        // 转换为本地路径
        return AVATAR_ROOT_DIR + File.separator + relativePath.replace("/", File.separator);
    }

    /**
     * 删除用户头像文件
     *
     * @param localPath 本地文件路径
     * @return 是否删除成功
     */
    public static boolean deleteAvatar(String localPath) {
        if (StrUtil.isBlank(localPath)) {
            return false;
        }

        try {
            File file = new File(localPath);
            if (file.exists()) {
                boolean deleted = FileUtil.del(file);
                if (deleted) {
                    log.info("删除头像文件成功: {}", localPath);
                    return true;
                } else {
                    log.warn("删除头像文件失败: {}", localPath);
                    return false;
                }
            } else {
                log.warn("头像文件不存在: {}", localPath);
                return true; // 文件不存在也算删除成功
            }
        } catch (Exception e) {
            log.error("删除头像文件时发生异常: {}", localPath, e);
            return false;
        }
    }

    /**
     * 删除用户所有头像文件
     *
     * @param userId 用户ID
     * @return 是否删除成功
     */
    public static boolean deleteUserAllAvatars(String userId) {
        if (StrUtil.isBlank(userId)) {
            return false;
        }

        try {
            String userAvatarDir = AVATAR_ROOT_DIR + File.separator + userId;
            File userDir = new File(userAvatarDir);
            if (userDir.exists() && userDir.isDirectory()) {
                boolean deleted = FileUtil.del(userDir);
                if (deleted) {
                    log.info("删除用户所有头像文件成功: {}", userAvatarDir);
                    return true;
                } else {
                    log.warn("删除用户所有头像文件失败: {}", userAvatarDir);
                    return false;
                }
            } else {
                log.warn("用户头像目录不存在: {}", userAvatarDir);
                return true; // 目录不存在也算删除成功
            }
        } catch (Exception e) {
            log.error("删除用户所有头像文件时发生异常: {}", userId, e);
            return false;
        }
    }

    /**
     * 检查文件是否存在
     *
     * @param localPath 本地文件路径
     * @return 文件是否存在
     */
    public static boolean fileExists(String localPath) {
        if (StrUtil.isBlank(localPath)) {
            return false;
        }
        return FileUtil.exist(localPath);
    }

    /**
     * 获取文件大小
     *
     * @param localPath 本地文件路径
     * @return 文件大小（字节）
     */
    public static long getFileSize(String localPath) {
        if (StrUtil.isBlank(localPath)) {
            return 0;
        }
        // 修复：传入File对象而不是字符串路径
        return FileUtil.size(new File(localPath));
    }

    /**
     * 获取用户头像目录路径
     *
     * @param userId 用户ID
     * @return 用户头像目录路径
     */
    public static String getUserAvatarDirectory(String userId) {
        return AVATAR_ROOT_DIR + File.separator + userId;
    }

    /**
     * 检查是否为用户头像文件
     *
     * @param filePath 文件路径
     * @return 是否为用户头像文件
     */
    public static boolean isUserAvatarFile(String filePath) {
        return StrUtil.isNotBlank(filePath) && filePath.startsWith(AVATAR_ROOT_DIR);
    }

    /**
     * 获取当前操作系统信息
     *
     * @return 操作系统信息
     */
    public static String getCurrentOS() {
        return System.getProperty("os.name") + " " + System.getProperty("os.version");
    }

    /**
     * 获取头像存储根目录
     *
     * @return 头像存储根目录
     */
    public static String getAvatarRootDirectory() {
        return AVATAR_ROOT_DIR;
    }
}